package br.com.datasun.biblioteca.delegate;

import java.util.List;

import br.com.datasun.biblioteca.entities.Assunto;
import br.com.datasun.biblioteca.entities.Biblioteca;
import br.com.datasun.biblioteca.entities.Categoria;
import br.com.datasun.biblioteca.entities.Editora;
import br.com.datasun.biblioteca.entities.Exemplar;
import br.com.datasun.biblioteca.entities.Livro;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.exceptions.AssuntoJaExistenteException;
import br.com.datasun.biblioteca.exceptions.AssuntoSemNomeException;
import br.com.datasun.biblioteca.exceptions.BairroInvalidoException;
import br.com.datasun.biblioteca.exceptions.BibliotecaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.BibliotecaSemNomeException;
import br.com.datasun.biblioteca.exceptions.BusinessException;
import br.com.datasun.biblioteca.exceptions.CEPInvalidoException;
import br.com.datasun.biblioteca.exceptions.CategoriaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.CategoriaSemNomeException;
import br.com.datasun.biblioteca.exceptions.CidadeRequeridaException;
import br.com.datasun.biblioteca.exceptions.EditoraJaExistenteException;
import br.com.datasun.biblioteca.exceptions.EditoraSemNomeException;
import br.com.datasun.biblioteca.exceptions.ExemplarBibliotecaNaoInformadaException;
import br.com.datasun.biblioteca.exceptions.ExemplarDataCompraNaoInformadaException;
import br.com.datasun.biblioteca.exceptions.ExemplarEstadoConservacaoNaoInformadoException;
import br.com.datasun.biblioteca.exceptions.ExemplarLivroNaoInformadoException;
import br.com.datasun.biblioteca.exceptions.ExemplarQuantidadeNaoInformadaException;
import br.com.datasun.biblioteca.exceptions.LogradouroInvalidoException;
import br.com.datasun.biblioteca.exceptions.NomeInvalidoException;
import br.com.datasun.biblioteca.exceptions.NumeroLogradouroInvalidoException;
import br.com.datasun.biblioteca.exceptions.PessoaFisicaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.PessoaFisicaSemNomeException;
import br.com.datasun.biblioteca.exceptions.DAOException;
import br.com.datasun.biblioteca.facade.CadastrosFacade;

public class CadastrosDelegate {
	private CadastrosFacade cadastrosFacade = new CadastrosFacade();
	
	public Assunto cadastrarAssunto(Assunto assunto) throws BusinessException, NullPointerException, NomeInvalidoException, AssuntoJaExistenteException, AssuntoSemNomeException{
		return cadastrosFacade.cadastrarAssunto(assunto);
	}
	
	public Assunto atualizarAssunto(Assunto assunto) throws BusinessException, NullPointerException, NomeInvalidoException, AssuntoJaExistenteException, AssuntoSemNomeException{
		return cadastrosFacade.atualizarAssunto(assunto);
	}
	
	public void excluirAssunto(Assunto assunto) throws BusinessException{
		cadastrosFacade.excluirAssunto(assunto);
	}
	
	//Editoras
	
	public Editora cadastrarEditora(Editora editora) throws BusinessException, NullPointerException, NomeInvalidoException, EditoraJaExistenteException, EditoraSemNomeException{
		return cadastrosFacade.cadastrarEditora(editora);
	}
	
	public Editora atualizarEditora(Editora editora) throws BusinessException, NullPointerException, NomeInvalidoException, EditoraJaExistenteException, EditoraSemNomeException{
		return cadastrosFacade.atualizarEditora(editora);
	}
	
	public void excluirEditora(Editora editora) throws BusinessException{
		cadastrosFacade.excluirEditora(editora);
	}
	
	//Fim Editoras
	
	public Biblioteca cadastrarBiblioteca(Biblioteca biblioteca)throws BibliotecaSemNomeException, BibliotecaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException,CidadeRequeridaException ,CEPInvalidoException , BusinessException, NullPointerException{
	   return cadastrosFacade.cadastrarBiblioteca(biblioteca);
	}
	
	public Biblioteca atualizarBiblioteca (Biblioteca biblioteca)throws BibliotecaSemNomeException, BibliotecaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException, CidadeRequeridaException ,CEPInvalidoException,BusinessException, NullPointerException{
		return cadastrosFacade.atualizarBiblioteca(biblioteca);
	}
	
	public void excluirBiblioteca (Biblioteca biblioteca) throws BusinessException{
		cadastrosFacade.excluirBiblioteca(biblioteca);
	}
	
	public Livro cadastrarLivro(Livro livro)throws BusinessException, NullPointerException{ //implementar os outros exeptions
		return cadastrosFacade.cadastrarLivro(livro);
	}
		
	public Livro atualizarLivro (Livro livro)throws  BusinessException, NullPointerException{ //implementar os outros exeptions
		return cadastrosFacade.atualizarLivro(livro);
	}
		
	public void excluirLivro (Livro livro) throws BusinessException{ 
		cadastrosFacade.excluirLivro(livro);
	}

	/**
	 *  Clientes
	 * 
	 */
	
	public PessoaFisica cadastrarCliente(PessoaFisica pessoaFisica) throws PessoaFisicaSemNomeException, PessoaFisicaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException, CidadeRequeridaException, BusinessException, NullPointerException{
		return cadastrosFacade.cadastrarCliente(pessoaFisica);
	}
	
	public PessoaFisica atualizarCliente(PessoaFisica pessoaFisica) throws PessoaFisicaSemNomeException, PessoaFisicaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException, CidadeRequeridaException, BusinessException, NullPointerException, DAOException{
		return cadastrosFacade.atualizarCliente(pessoaFisica);
	}
	
	public void excluirCliente(PessoaFisica pessoaFisica)  throws BusinessException{
		cadastrosFacade.excluirCliente(pessoaFisica);
	}
	
	/**
	 *  Categoria
	 * 
	 */
	
	public Categoria cadastrarCategoria(Categoria categoria) throws CategoriaSemNomeException, CategoriaJaExistenteException, BusinessException, NullPointerException {
		return cadastrosFacade.cadastrarCategoria(categoria);
	}
	
	public Categoria atualizarCategoria(Categoria categoria) throws CategoriaSemNomeException, CategoriaJaExistenteException, BusinessException, NullPointerException {
		return cadastrosFacade.atualizarCategoria(categoria);
	}
	
	public void excluirCategoria(Categoria categoria) throws BusinessException {
		cadastrosFacade.excluirCategoria(categoria);
	}
	
	/**
	 * Exemplares
	 */
	
	public List<Exemplar> cadastrarExemplares (Exemplar exemplar,int Quantidade  ) throws BusinessException, NullPointerException, ExemplarBibliotecaNaoInformadaException, ExemplarLivroNaoInformadoException, ExemplarDataCompraNaoInformadaException, ExemplarEstadoConservacaoNaoInformadoException, ExemplarQuantidadeNaoInformadaException  {
		return cadastrosFacade.cadastrarExemplares(exemplar, Quantidade);
	}
	
	public boolean atualizarExemplar(Exemplar exemplar) throws BusinessException, NullPointerException, ExemplarBibliotecaNaoInformadaException, ExemplarLivroNaoInformadoException, ExemplarDataCompraNaoInformadaException, ExemplarEstadoConservacaoNaoInformadoException  {
		return cadastrosFacade.atualizarExemplar(exemplar);
	}
	
	public boolean excluirExemplar(Exemplar exemplar) throws BusinessException{
		return cadastrosFacade.excluir(exemplar);
	}
}
